package com.sgcc.pda.safe.impl;

import com.sgcc.pda.hzaidl.entity.SafeCallback;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * 描述：安全管控服务aidl操作类。
 * 作者：LiuChang 2020/09/17 10:06
 * 修改描述：
 * 修改人：
 * 修改版本：
 */
public class SafeManager {
    private static SafeManager mInstance;
    private static boolean isEnabled = false;//是否启用安全管控服务

    public static boolean isEnabled() {
        return isEnabled;
    }

    public static void setIsEnabled(boolean isEnabled) {
        SafeManager.isEnabled = isEnabled;
    }

    /**
     * 单例
     *
     * @return
     */
    public static synchronized SafeManager getInstance() {
        if (mInstance == null) {
            mInstance = new SafeManager();
        }
        return mInstance;
    }


    /**
     * 验证工作票状态
     *
     * @param appNo    工单号
     * @param callback 回调 {"RT_D":"成功","RT_F":"1","DTS":{"checked":"true","needWorkTicket":"false","workTicketState":"01"}}
     *                 数据说明：
     *                 1、checked：工作票状态验证是否通过
     *                 2、needWorkTicket：是否需要申请工作票
     *                 3、workTicketState：工作票状态，详情参考MP_WORK_TICKET_STATE/工作票状态
     *                 <p>
     *                 checked = true表示，当前工作票状态验证为通过，业务应用流程可以继续进行下一步操作。
     *                 checked = false 表示，当前工作票状态验证不通过，业务应用流程需要暂停在当前流程，直至再次调用此验证工作票状态接口返回checked = true时方可继续进行下一步流程操作。
     *                 当checked = false时，安全管控服务会自动弹出是否跳转工作票确认弹窗，用户点击“确定”后，由安全管控服务负责处理跳转至工作票App。
     */
    public void verifyWorkTicketState(String appNo, SafeCallback callback) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("action", "verifyWorkTicketState");
            JSONObject param = new JSONObject();
            param.put("appNo", appNo);
            jb.put("requestParams", param.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        SafeUtil.request("channel", jb.toString(), callback);
    }

    /**
     * 验证班前会状态
     *
     * @param appNo    工单号
     * @param callback 回调 {"RT_D":"成功","RT_F":"1","DTS":{"checked":"true","siteMeetingFinish":"true","workTicketState":"04"}}
     *                 数据说明：
     *                 1、checked：班前会状态验证是否通过
     *                 2、siteMeetingFinish：班前会是否已召开
     *                 3、workTicketState：工作票状态，详情参考MP_WORK_TICKET_STATE/工作票状态
     *                 <p>
     *                 checked = true表示，当前班前会状态验证为通过，业务应用流程可以继续进行下一步操作。
     *                 checked = false 表示，当前班前会状态验证不通过，业务应用流程需要暂停在当前流程，直至再次调用此验证班前会状态接口返回checked = true时方可继续进行下一步流程操作。
     *                 当checked = false时，安全管控服务会自动弹出是否跳转班前会确认弹窗，用户点击“确定”后，由安全管控服务负责处理跳转至班前会App。
     */
    public void verifySiteMeetingState(String appNo, SafeCallback callback) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("action", "verifySiteMeetingState");
            JSONObject param = new JSONObject();
            param.put("appNo", appNo);
            jb.put("requestParams", param.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        SafeUtil.request("channel", jb.toString(), callback);
    }

    /**
     * 验证风险点验收情况
     *
     * @param appNo    工单号
     * @param stepNos  阶段标识
     * @param callback 回调 {"RT_D":"成功","RT_F":"1","DTS":{"checked":"true","riskPointFinish":"true","workTicketState":"04"}}
     *                 数据说明：
     *                 1、checked：风险点验收情况验证是否通过
     *                 2、riskPointFinish：风险点验收是否完成
     *                 3、workTicketState：工作票状态，详情参考MP_WORK_TICKET_STATE/工作票状态
     *                 <p>
     *                 checked = true表示，当前风险点验证状态验证为通过，业务应用流程可以继续进行下一步操作。
     *                 checked = false 表示，当前风险点验证状态验证不通过，业务应用流程需要暂停在当前流程，直至再次调用此验证风险点验证状态接口返回checked = true时方可继续进行下一步流程操作。
     *                 当checked = false时，安全管控服务会自动弹出是否跳转风险点确认弹窗，用户点击“确定”后，由安全管控服务负责处理跳转至风险点App。
     */
    public void verifyRiskPointState(String appNo, List<String> stepNos, SafeCallback callback) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("action", "verifyRiskPointState");
            JSONObject param = new JSONObject();
            param.put("appNo", appNo);
            param.put("stepNo", new JSONArray(stepNos));
            jb.put("requestParams", param.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        SafeUtil.request("channel", jb.toString(), callback);
    }

    /**
     * 验证风险点验收情况
     *
     * @param appNo    工单号
     * @param stepNo   阶段标识
     * @param callback 回调
     */
    public void verifyRiskPointState(String appNo, String stepNo, SafeCallback callback) {
        List<String> list = new ArrayList<>();
        list.add(stepNo);
        verifyRiskPointState(appNo, list, callback);
    }

    /**
     * 跳转指定知识库内容
     *
     * @param appNo    工单号
     * @param proceNos 阶段标识
     * @param callback 回调 {"RT_D":"成功","RT_F":"1"}
     */
    public void gotoKnowledgeBase(String appNo, List<String> proceNos, SafeCallback callback) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("action", "gotoKnowledgeBase");
            JSONObject param = new JSONObject();
            param.put("appNo", appNo);
            param.put("procNo", new JSONArray(proceNos));
            jb.put("requestParams", param.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        SafeUtil.request("channel", jb.toString(), callback);
    }

    /**
     * 跳转指定知识库内容
     *
     * @param appNo    工单号
     * @param proceNo  阶段标识
     * @param callback 回调 {"RT_D":"成功","RT_F":"1"}
     */
    public void gotoKnowledgeBase(String appNo, String proceNo, SafeCallback callback) {
        List<String> list = new ArrayList<>();
        list.add(proceNo);
        gotoKnowledgeBase(appNo, list, callback);
    }

    /**
     * 跳转风险点验收界面
     *
     * @param appNo    工单号
     * @param stepNos  阶段标识
     * @param callback 回调 {"RT_D":"成功","RT_F":"1"}
     */
    public void gotoRiskEvidence(String appNo, List<String> stepNos, SafeCallback callback) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("action", "gotoRiskEvidence");
            JSONObject param = new JSONObject();
            param.put("appNo", appNo);
            param.put("stepNo", new JSONArray(stepNos));
            jb.put("requestParams", param.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        SafeUtil.request("channel", jb.toString(), callback);
    }

    /**
     * 跳转风险点验收界面
     *
     * @param appNo    工单号
     * @param stepNo   阶段标识
     * @param callback 回调 {"RT_D":"成功","RT_F":"1"}
     */
    public void gotoRiskEvidence(String appNo, String stepNo, SafeCallback callback) {
        List<String> list = new ArrayList<>();
        list.add(stepNo);
        gotoRiskEvidence(appNo, list, callback);
    }

    /**
     * 申请终结工作票
     *
     * @param appNo    工单号
     * @param appNo    阶段标识
     * @param callback 回调 {"RT_D":"成功","RT_F":"1","DTS":{"checked":"true","workTicketState":"04"}}
     *                 数据说明：
     *                 1、checked：申请终结工作票是否成功
     *                 2、workTicketState：工作票状态，详情参考MP_WORK_TICKET_STATE/工作票状态
     *                 01	待提交
     *                 02	待签发
     *                 03	待许可
     *                 04	待终结
     *                 05	已终结
     *                 20	间断
     *                 checked = true表示，当前申请终结工作票为成功，业务应用流程可以继续进行下一步操作。
     *                 checked = false 表示，当前申请终结工作票未成功，业务应用流程需要暂停在当前流程，直至再次调用此申请终结工作票接口返回checked = true时方可继续进行下一步流程操作。
     *                 当checked = false时，安全管控服务会自动弹出是否跳转工作票确认弹窗，用户点击“确定”后，由安全管控服务负责处理跳转至工作票App。
     *                 注：若当前工作票下绑定多个工单时且不满足工作票终结条件时，此时安全管控服务无确认弹窗且返回checked = true，业务应用流程可以继续进行流程下一步操作。
     */
    public void applyCloseWorkTicket(String appNo, SafeCallback callback) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("action", "applyCloseWorkTicket");
            JSONObject param = new JSONObject();
            param.put("appNo", appNo);
            jb.put("requestParams", param.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        SafeUtil.request("channel", jb.toString(), callback);
    }

    /**
     * 作业监控工作计划列表
     *
     * @param callback 回调
     */
    public void getMonitorPlanList(SafeCallback callback) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("action", "loadMonitorPlan");
            JSONObject param = new JSONObject();
            jb.put("requestParams", param.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        SafeUtil.request("channel", jb.toString(), callback);
    }

}
